<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 继承： 子类拥有(访问到)父类的属性和方法
        // 通过构造函数创建的实例，可以共享原型上的属性和方法。

        // 父类
        function Parent(name) {
            this.name = name || '父类'
            this.arr = [1, 2, 3]  // (强调私有)
        }
        Parent.prototype.say = function () {
            console.log('hello')
        }

        // 子类
        function Child(hobby) {
            this.hobby = hobby
        }

        // new Parent() ==> 实例对象person person.__proto__ === Parent.prototype

        // 让子类的原型等于父类的实例，让原型链链接起来
        Child.prototype = new Parent()
        // 因为new Parent() 相当于覆盖了Child.prototype的本身的原型对象
        // 所以，这里我们应该指回本身的构造函数
        Child.prototype.constructor = Child // 是不是原型链继承，和这句话没关系


        const boy1 = new Child('music')
        const boy2 = new Child('dance')
        console.log('------------------')
        console.log(boy1.constructor)
        console.log(boy1)
        console.log(boy2)

        // 需求，想要boy1能访问到Parent上的name arr这些属性
        // 如果Parent它的原型在子类的原型链上，这个实例就能访问到Parent的属性和方法
        console.log(boy1.name)
        boy1.say()


        // 1. 优点：属性共享、方法复用
        // 实例共享了父类的原型上的方法
        boy1.say()
        boy2.say()
        console.log(boy1.say === boy2.say) // true

        // 2. 缺点：
        // 2.1 子类实例化的时候，不能给父类构造函数传参
        console.log(boy1.name, boy2.name)

        // 2.2 子类实例共享了父类的引用属性
        //    实例修改了这个属性值后，会相互影响
        console.log(boy1.arr)
        boy1.arr.push(666)
        console.log(boy1.arr)
        console.log(boy2.arr)

        /*==================================  注意  ====================================*/
        // 1. 这里修改boy1.name 相当于给这个实例添加一个name的属性, 不会影响到父类那块的name
        console.log('---------------------')
        console.log(boy1)
        boy1.name = 888  // 相当于给这个实例添加一个name的属性
        // console.log(bod)
        console.log(boy2.name)


        // 2. 我们这里希望boy1.constructor 指回Child
        console.log(boy1.constructor)  // ==>  boy1.__proto__.constructor 


        // function Animal(){
            
        // }
        // const cat = new Animal()
        // console.log(cat.constructor)‘
    </script>
</body>

</html>